package reflect;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URISyntaxException;

/**
 * 扫描reflect包中所有类，并自动调用他们本类定义的
 * 含有"s"的无参数方法
 */
public class Test2 {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
        /*
            找到和Test2.class在同一个目录中的test.txt文件
            注意！！不是和Test2.java源码所在同一个目录中!
            IDEA将源代码编译后都放在了项目目录下的target/classes下了
         */
//        System.out.println(
//                Test2.class.getResource("test.txt")
//        );

        /*
            通过Test2.class.getClassLoader()类加载器开始寻找
            资源时，此时相对的路径就是当前项目所有类编译后的字节码
            文件同一所在的目录，就是当前类的包的上一级。
            例如当前类Test2包定义为:
            package reflect;
            那么这里的路径就是reflect所在的目录。

            假如Test2的包路径为:
            packet com.webserver.core;
            那么这里的路径就是com所在的目录

         */
//        System.out.println(
//            Test2.class.getClassLoader().
//                    getResource("reflect/test.txt")
//        );

        File dir = new File(
                Test2.class.getClassLoader().getResource(
                        "reflect"
                ).toURI()
        );
        File[] subs = dir.listFiles(e->e.getName().endsWith(".class"));
        for(File sub : subs){
            //根据字节码文件名确定类名
            String className = sub.getName().substring(0,sub.getName().indexOf("."));
            Class cls = Class.forName("reflect."+className);
            System.out.println("正在实例化:"+className);
            Object obj = cls.newInstance();


            Method[] methods = cls.getDeclaredMethods();
            for(Method m : methods){
                if(m.getParameterCount()==0&&m.getName().contains("s")){
                    m.invoke(obj);
                }
            }
        }

    }
}
